TITL DAI FIRMWARE 1E414-1E5F7 V1.0 Rev.1 ORG :E414 * * * *********************************** * CHANGE CONTENTS MACC TO INTEGER * *********************************** * * Entry: None. * Exit: All registers preserved. * XFIX PUSH PSW PUSH B PUSH D PUSH H CALL :E133 Copy MACC to ABCD PUSH PSW Save exp.byte ANI :7F Exponent only JZ :E43B Exp=0: Clear MACC, abort CPI :40 Exp negative ? JNC :E43B Then clear MACC, abort SUI :20 Exp >= 32 ? JNC :E43F Then run overflow error CMA ) 2-complement of exp INR A ) CALL :EB55 Shift BCDE right A times POP PSW Get exp byte ORA A CM :E3C9 Nr <0: negate BCDE JC :E322 Jump if overflow JMP :E328 Copy BCDE into MACC, abort REM * If number is 0 or exponent negative: REM L1E65 POP PSW JMP :E40E Clear MACC, abort REM * if overflow: REM L1E66 POP PSW JMP :E322 Run overflow error, abort * ************** * FPT INT(X) * ************** * * The contents of the MACC is replaced by its * FPT integer part. The fractional bits of the * mantissa are masked off. * * Exit: All registers preserved. * XFINT PUSH PSW PUSH B PUSH D PUSH H LXI H,:00D5 Addr MACC MOV A,M Get exp.byte ANI :7F Exponent only JZ :E40E If exp=0: Clear MACC, abort CPI :40 Exp negative ? JNC :E40E Then clear MACC, abort SUI :19 Exp - nr of mantissa bits LXI H,:00D8 Addr lobyte MACC MVI E,:03 3 bytes in mantissa MOV D,A Rest exp in D L1E68 MVI C,:08 8 bits pro byte L1E69 INR D Rest exp + 1 STC Mask '1' for bits reqd JP :E465 If rest exp >=0 CMC Mask '0' for bits not reqd L1E70 RAR Shift CY into A to make mask DCR C JNZ :E45F Next bit if not ready ANA M Mask MACC byte with mask MOV M,A Result back in MACC DCX H Addr next MACC byte DCR E JNZ :E45D Next byte if not ready JMP :C14D Popall, ret * ********************* * AMD: FPT ADDITION * ********************* * * MTOS = MTOS + MEM. * * Entry: HL points to operand in memory. * Exit: All registers preserved. * ZFADD CALL :E527 Wait, load, operate imm. DATA :10 FPT addition RET * ************************ * AMD: FPT SUBTRACTION * ************************ * * MTOS = MTOS - MEM. * * Entry: HL points to operand in memory. * Exit: All registers preserved. * ZFSUB CALL :E527 Wait, load, operate imm. DATA :11 FPT subtraction RET * *************************** * AMD: FPT MULTIPLICATION * *************************** * * MTOS = MTOS * MEM. * * Entry: HL points to multiplier in memory. * Exit: All registers preserved. * ZFMUL CALL :E527 Wait, load, operate imm. DATA :12 FPT multiplication RET * ********************* * AMD: FPT DIVISION * ********************* * * MTOS = MTOS / MEM. * * Entry: HL points to divisor in memory. * Exit: All registers preserved. * ZFDIV CALL :E527 Wait, load, operate imm. DATA :13 FPT division RET * **************** * AMD: FPT ABS * **************** * * MTOS is replaced by its absolute value (FPT). * * Entry: None. * Exit: All registers preserved. * ZFABS PUSH PSW CALL :ED95 Get status bits NOP ADD A Test bit 6 (sign) CM :E493 Change sign if reqd (FPT) POP PSW RET * **************************************** * AMD: CHANGE SIGN MTOS CONTENTS (FPT) * **************************************** * * MTOS = - MTOS. * * Entry: None. * Exit: All registers preserved. * ZFCHS CALL :E535 Wait, operate immediate DATA :15 FPT change sign MTOS RET * ******************* * AMD: FPT INT(X) * ******************* * * MTOS is replaced by its integer part. * ZFINT CALL :E4EF Convert MTOS to INT REM * Entry for AMD: Change MTOS to FPT: REM ZFLT CALL :E535 Wait, load, operate imm. DATA :1C Convert MTOS to FPT RET * ***************** * AMD: FPT FRAC * ***************** * * MTOS is replaced by its fractional part. * ZFRAC CALL :E535 Wait, load, operate imm. DATA :37 Push MTOS CALL :E498 MTOS = INT(MTOS) CALL :E535 Wait, load, operate imm. DATA :11 Subtract whole number RET * ****************************** * part of AMD: POWER (1EDA1) * ****************************** * * Entry: HL points to operand in memory. * Exit: All registers preserved. * MPR14 CALL :E527 Wait, load, operate imm. DATA :0B MTOS = MTOS ^ MEM RET * ************ * AMD: LOG * ************ * ZLN CALL :E535 Wait, operate immediate DATA :09 MTOS = LN (MTOS) RET * ************ * AMD: EXP * ************ * ZEXP CALL :E535 Wait, operate immediate DATA :0A MTOS = E ^ MTOS RET * ************* * AMD: LOGT * ************* * ZLOG CALL :E535 Wait, operate immediate DATA :08 MTOS = LOG (MTOS) RET * ************* * AMD: ALOG * ************* * ZALOG PUSH H LXI H,:E890 Addr 1/logn(10) CALL :E483 MTOS = MTOS/MEM POP H CALL :E4B6 MTOS = e ^ MTOS RET * ************ * AMD: SQR * ************ * ZSQRT CALL :E535 Wait, operate immediate DATA :01 MTOS = SQRT (MTOS) RET * ************ * AMD: SIN * ************ * ZSIN CALL :E535 Wait, operate immediate DATA :02 MTOS = SIN (MTOS) RET * ************ * AMD: COS * ************ * ZCOS CALL :E535 Wait, operate immediate DATA :03 MTOS = COS (MTOS) RET * ************ * AMD: TAN * ************ * ZTAN CALL :E535 Wait, operate immediate DATA :04 MTOS = TAN (MTOS) RET * ************* * AMD: ASIN * ************* * ZASIN CALL :E535 Wait, operate immediate DATA :05 MTOS = ASIN (MTOS) RET * ************* * AMD: ACOS * ************* * ZACOS CALL :E535 Wait, operate immediate DATA :06 MTOS = ACOS (MTOS) RET * ************ * AMD: ATN * ************ * ZATAN CALL :E535 Wait, operate immediate DATA :07 MTOS = ATAN (MTOS) RET * **************************************** * AMD: CHANGE CONTENTS MTOS TO INTEGER * **************************************** * ZFIX CALL :E535 Wait, operate immediate DATA :1E MTOS = INT(MTOS) RET * ********************* * AMD: INT ADDITION * ********************* * * MTOS = MTOS + MEM. * * Entry: HL points to number in memory. * Exit: All registers reserved. * ZIADD CALL :E527 Wait, load, operate imm. DATA :2C INT addition RET * ************************ * AMD: INT SUBTRACTION * ************************ * * MTOS = MTOS - MEM. * * Entry: HL points to number in memory. * Exit: All registers preserved. * ZISUB CALL :E527 Wait, load, operate imm. DATA :2D INT subtraction RET * *************************** * AMD: INT MULTIPLICATION * *************************** * * MTOS = MTOS * MEM. * * Entry: HL points to number in memory. * Exit: All registers preserved. * ZIMUL CALL :E527 Wait, load, operate imm. DATA :2E INT multiplication RET * ********************* * AMD: INT DIVISION * ********************* * * MTOS = MTOS / MEM. * * Entry: HL points to number in memory. * Exit: All registers preserved. * ZIDIV CALL :E527 Wait, load, operate imm. DATA :2F INT division RET * ***************************** * AMD: INT DIVIDE REMAINDER * ***************************** * * MTOS = INT remainder of MTOS / MEM. * * Entry: HL points to number in memory. * Exit: All registers preserved. * ZIREM CALL :E535 Wait, operate immediate DATA :37 Push MTOS CALL :E503 INT divide CALL :E4FE INT multiply back CALL :E535 Wait, operate immediate DATA :2D Subtract: difference = REM remainder RET * * * **************** * AMD: INT ABS * **************** * * MTOS = absolute value of MTOS (INT). * ZIABS PUSH PSW CALL :ED95 Get status bits NOP ADD A Test bit 6 (sign) CM :E522 Change sign MTOS if reqd POP PSW RET * ******************************* * AMD: CHANGE SIGN MTOS (INT) * ******************************* * ZICHS CALL :E535 Wait, operate immediate DATA :34 MTOS = - MTOS RET * ************************************** * AMD: WAIT, LOAD, OPERATE IMMEDIATE * ************************************** * * Call has to be followed by a 1 byte AMD command. * WLOPI CALL :E53B Wait for ready, evt. error REM indications CALL :E588 Load 2nd operand in MTOS OPI XTHL HL pnts to command byte PUSH PSW CALL :ECCC Issue command to AMD POP PSW XTHL Restore returnaddr RET * ******************************** * AMD: WAIT, OPERATE IMMEDIATE * ******************************** * * Call has to be followed by a 1 byte AMD command. * WOPI CALL :E53B Wait ready, evt. error REM indications JMP :E52D Issue command to AMD * ********************************* * AMD: WAIT FOR MATH.CHIP READY * ********************************* * * Waits for math.chip ready. Handles eventual * errors if found. * * Exit: If no errors: All registers preserved. * WMATH PUSH PSW WMT10 LDA :FB02 Get status math.chip ORA A JM :E53C If busy: wait for ready ANI :1E Error codes only JZ :E55D Abort if no errors NOP CALL :ECD2 Reset AMD status RAR RAR CC :C04B Evt. run overflow error RAR CC :C065 Evt. run underflow error RAR CC :C05E Evt. run argument error RAR CC :C06C Evt. run divide by 0 error WMT20 POP PSW Normal return RET * ***************************************** * AMD: COPY REGISTERS A,B,C,D INTO MTOS * ***************************************** * ZPUT PUSH PSW MOV A,D D into A CALL :E53B Wait ready ZPT10 STA :FB00 Copy (D) into MTOS MOV A,C C into A STA :FB00 Copy (C) into MTOS MOV A,B JMP :ECD9 Copy (B)+(A) into MTOS * ***************************************** * AMD: COPY MTOS INTO REGISTERS A,B,C,D * ***************************************** * ZGET CALL :E53B Wait ready LDA :FB00 Get hibyte from MTOS PUSH PSW Save it on stack LDA :FB00 Get 2nd byte from MTOS MOV B,A Store it in B LDA :FB00 Get 3rd byte from MTOS MOV C,A Store it in C LDA :FB00 Get lobyte from MTOS MOV D,A Store it in D JMP :E564 Restore MTOS * ************** * (not used) * ************** * L1E109 MOV D,L POP H RET * ******************************* * AMD: COPY OPERAND INTO MTOS * ******************************* * * Entry: HL points to 1st byte of operand. * Exit: All registers preserved. * ZLOAD PUSH PSW PUSH B PUSH D PUSH H MOV A,M 1st byte in A INX H MOV B,M 2nd byte in B INX H MOV C,M 3rd byte in C INX H MOV D,M 4th byte in D CALL :E55F Copy ABCD into MTOS JMP :C14D Popall, ret * ***************************** * AMD: COPY MTOS TO OPERAND * ***************************** * * Entry: HL points to 1st byte of operand. * Exit: All registers preserved. * ZSAVE PUSH PSW PUSH B PUSH D PUSH H CALL :E56F Copy MTOS into ABCD MOV M,A ) INX H ) MOV M,B ) INX H ) Copy ABCD into operand MOV M,C ) INX H ) MOV M,D ) JMP :C14D Popall, ret * ************************ * CALCULATE TAYLOR SUM * ************************ * * Entry: HL points to a list with FPT constants * (Mi with i = 0,1,2,...). * MACC: Const. term of Taylor series (S0). * 00E3-E6: Initial power of argument (P). * 00E7-EA: Argument X. * * Routine computes: * Sum = S0 + M0*P + M1*P*X + M2*P*X^2 + ...... * * Exit: 00EB-EE: Sum of series. * 00E3-E6: Last P*X^i added in. * 00E7-EA: Preserved. * MACC + ABCD: Sum of series. * FEHL corrupted. * L1E112 PUSH H Save table pntr LXI H,:00EB CALL :E9D6 Copy MACC (S0) into 00EB-EE LXI H,:00E3 CALL :E9FB Copy 00E3-E6 (P) into MACC L1E113 POP H PUSH H ) Get and save table pntr CALL :EA59 MACC = P * Mi LXI H,:00EB PUSH H CALL :EA72 MACC = sum + P * Mi POP H CALL :E9DB Result in 00EB-EE LDA :00DE Get difference in exp ORA A JP :E5D3 CPI :E8 JC :E5F3 L1E114 POP H Get table pntr INX H INX H INX H INX H HL pnts to next table entry PUSH H Save table pntr INX H MOV A,M ORA A JP :E5F3 Jump if ready LXI H,:00E3 PUSH H CALL :E9FB Copy 00E3-E6 into MACC REM and reg ABCD LXI H,:00E7 CALL :EA59 Multiply with 00E7-EA POP H HL=00E3 CALL :E9DB Copy ABCD into 00E3-E6 JMP :E5B7 Calc next sum * L1E115 POP H CALL :E9F8 Copy result into MACC REM and reg ABCD RET * * * END